﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace StockTradTest.Data
{
    public class GetRealTimeInfo
    {
        private static WebClient _client;
        public static WebClient Client
        {
            get
            {
                if(_client == null)
                {
                    _client = new WebClient();
                }
                return _client;
            }
            set
            {
                _client = value;
            }
        }
        public static RealTimeInfo GetStockRealTimeInfo(string code)
        {
            //http://hq.sinajs.cn/list=sh601166
            /*
            0：”大秦铁路”，股票名字；
            1：”27.55″，今日开盘价；
            2：”27.25″，昨日收盘价；
            3：”26.91″，当前价格；
            4：”27.55″，今日最高价；
            5：”26.20″，今日最低价；
            6：”26.91″，竞买价，即“买一”报价；
            7：”26.92″，竞卖价，即“卖一”报价；
            8：”22114263″，成交的股票数，由于股票交易以一百股为基本单位，所以在使用时，通常把该值除以一百；
            9：”589824680″，成交金额，单位为“元”，为了一目了然，通常以“万元”为成交金额的单位，所以通常把该值除以一万；
            10：”4695″，“买一”申请4695股，即47手；
            11：”26.91″，“买一”报价；
            12：”57590″，“买二”
            13：”26.90″，“买二”
            14：”14700″，“买三”
            15：”26.89″，“买三”
            16：”14300″，“买四”
            17：”26.88″，“买四”
            18：”15100″，“买五”
            19：”26.87″，“买五”
            20：”3100″，“卖一”申报3100股，即31手；
            21：”26.92″，“卖一”报价
            (22, 23), (24, 25), (26, 27), (28, 29)分别为“卖二”至“卖四的情况”
            30：”2008 - 01 - 11″，日期；
            31：”15:05:32″，时间；*/
            string url = string.Format(@"http://hq.sinajs.cn/list={0}{1}", code.StartsWith("6") ? "sh" : "sz", code);
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            Client.Encoding = Encoding.GetEncoding("GB2312");
            var value = Client.DownloadString(url);
            value = Regex.Replace(value, string.Format("var hq_str_{0}{1}=\"", code.StartsWith("6") ? "sh" : "sz", code), "").Replace(",\";", "");
            string[] data = value.Split(',');
            if (data.Length < 20) return null;
            RealTimeInfo info = new RealTimeInfo();
            info.stockName = data[0];
            double.TryParse(data[1], out info.open);
            double.TryParse(data[2], out info.lastClose);
            double.TryParse(data[3], out info.currentPrice);
            double.TryParse(data[4], out info.high);
            double.TryParse(data[5], out info.low);
            double.TryParse(data[6], out info.buy1Price);
            double.TryParse(data[7], out info.sell1Price);
            double.TryParse(data[8], out info.volume);
            double.TryParse(data[9], out info.amount);
            double.TryParse(data[10], out info.buy1volume);
            double.TryParse(data[20], out info.sell1volume);
            info.time = Convert.ToDateTime(data[30] + " " + data[31]);

            return info;

        }
        public static RealTimeInfo GetIndexRealTimeInfo(string code)
        {
            //http://hq.sinajs.cn/list=sh601166
            /*
            0：”大秦铁路”，股票名字；
            1：”27.55″，今日开盘价；
            2：”27.25″，昨日收盘价；
            3：”26.91″，当前价格；
            4：”27.55″，今日最高价；
            5：”26.20″，今日最低价；
            6：”26.91″，竞买价，即“买一”报价；
            7：”26.92″，竞卖价，即“卖一”报价；
            8：”22114263″，成交的股票数，由于股票交易以一百股为基本单位，所以在使用时，通常把该值除以一百；
            9：”589824680″，成交金额，单位为“元”，为了一目了然，通常以“万元”为成交金额的单位，所以通常把该值除以一万；
            10：”4695″，“买一”申请4695股，即47手；
            11：”26.91″，“买一”报价；
            12：”57590″，“买二”
            13：”26.90″，“买二”
            14：”14700″，“买三”
            15：”26.89″，“买三”
            16：”14300″，“买四”
            17：”26.88″，“买四”
            18：”15100″，“买五”
            19：”26.87″，“买五”
            20：”3100″，“卖一”申报3100股，即31手；
            21：”26.92″，“卖一”报价
            (22, 23), (24, 25), (26, 27), (28, 29)分别为“卖二”至“卖四的情况”
            30：”2008 - 01 - 11″，日期；
            31：”15:05:32″，时间；*/
            string url = string.Format(@"http://hq.sinajs.cn/list={0}{1}", code.StartsWith("0") ? "sh" : "sz", code);
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            Client.Encoding = Encoding.GetEncoding("GB2312");
            var value = Client.DownloadString(url);
            value = Regex.Replace(value, string.Format("var hq_str_{0}{1}=\"", code.StartsWith("0") ? "sh" : "sz", code), "").Replace(",\";", "");
            string[] data = value.Split(',');
            if (data.Length < 20) return null;
            RealTimeInfo info = new RealTimeInfo();
            info.stockName = data[0];
            double.TryParse(data[1], out info.open);
            double.TryParse(data[2], out info.lastClose);
            double.TryParse(data[3], out info.currentPrice);
            double.TryParse(data[4], out info.high);
            double.TryParse(data[5], out info.low);
            double.TryParse(data[6], out info.buy1Price);
            double.TryParse(data[7], out info.sell1Price);
            double.TryParse(data[8], out info.volume);
            double.TryParse(data[9], out info.amount);
            double.TryParse(data[10], out info.buy1volume);
            double.TryParse(data[20], out info.sell1volume);
            info.time = Convert.ToDateTime(data[30] + " " + data[31]);

            return info;

        }
    }
}
